package com.cskaoyan.javase.oop2._1extends._2conversion;
/**
 * 引用数据类型的类型转换
 * Father fs = new Son();
 * 上述语句，将一个本该是子类Son引用指向的对象，用父类Father引用指向了。
 * 这其实就是一种引用数据类型的类型转换。
 *
 * 1.引用数据类型的类型转换，转换的是什么的类型？
 * 转换的是引用的数据类型，不可能转换对象的类型。
 *
 * 2.引用数据类型的类型转换，想要发生，有什么前提条件？
 * 必须发生在继承中的两个类之间，或者说只能发生在父子类之间。
 *
 * 3.引用数据类型的类型转换，分类：
 *      a.自动类型转换
 *      b.强制类型转换
 * 4.引用数据类型的自动类型转换,自动是编译器自动完成引用的数据类型转换,程序员无需写额外代码,就是自动类型转换.
 *      条件: 因为子类可以当做父类使用,子类"is-a"父类.
 *      当你把子类对象引用转换成父类对象引用时,这个过程自动完成,是自动类型转换.
 *      子 ---> 父
 *      从继承的方向上来说,引用数据类型的自动类型转换,是向上的.
 *      所以也叫"向上转型"(这是更常用的叫法)
 *
 * 5.引用数据类型的强制类型转换,所谓强制指的是编译器不会自动完成类型转换,需要程序员写额外代码完成类型转换,它的语法是:
 *      被强转后的类名 对象名 = (被强转后的类名)引用
 *
 *      条件: 因为父类不能直接当做子类用
 *      当你把父类对象引用转换成子类对象引用时,这个过程不会自动完成,需要程序员手动写代码完成,即强制类型转换
 *      父 ---> 子
 *      从继承的方向上来说,引用数据类型的强制类型转换,是向下的.
 *      所以也叫"向下转型"(这是更常用的叫法)
 *
 * 自动类型转换比较简单,我们直接写父类引用指向子类对象就是一个自动类型转换
 * 但强制类型转换比较复杂,涉及的内容比较多,多态的时候再详细讲.
 *
 * @since 17:37
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // Son s = new Son();
        // Father fs = s;

        Father fs = new Son();
        // String str = (String) fs;
    }
}
class Father{
    int a;
    public void test(){
        System.out.println("test father");
    }
}
class Son extends Father{}